'''
创建一个BankAccount类，要求：
有类属性bank_name（银行名称）
有实例属性account_name（账户名）和balance（余额）
有方法deposit(amount)（存款）和withdraw(amount)（取款）
有方法display()显示账户信息
修改上面的BankAccount类，将实例属性私有化，并提供相应的getter和setter方法，在setter方法中加入验证逻辑（余额不能为负数）。
为BankAccount类添加一个类方法change_bank_name(new_name)用于修改银行名称，
和一个静态方法calculate_interest(principal, rate, time)用于计算利息(金额，利率，时间)。
'''
class BankAccount:
    bank_name = ''
    def __init__(self,name,balance=0):
        self.__name = name
        self.__balance = balance

    def deposit(self,amount):#存款
        self.__balance += amount
        return print(f"当前余额{self.__balance}")

    def withdraw(self,amount):#取款
        if amount > self.__balance:
            return print("没这么多")
        else:
            self.__balance -= amount
            print(f"取出{amount},当前余额{self.__balance}")

    def display(self):#显示账户信息
        return print(f"账户信息：{self.__name},余额：{self.__balance}")

    def get_name(self):#获取账户
        return self.__name

    def get_balance(self):#获取余额
        return self.__balance

    def set_balance(self,balance):#修改余额
        self.__balance=balance
        return self.__balance

    def set_name(self,name):#修改名称
        self.__name=name
        return self.__name

    def change_bank_name(self,new_name):
        BankAccount.bank_name = new_name
        print(f'银行信息已经更新：{BankAccount.bank_name}')

    @staticmethod
    def calculate_interest(principal,rate,time):#计算利息
        rise=principal*(1+rate)*time
        return print(f'利息：{rise}')

#测试

def part1():
    z = BankAccount('Alexx')
    BankAccount.bank_name = '招商银行'#定义类属性
    z.display()#查看账户信息
    z.set_balance(100)#存100
    z.deposit(100)
    z.withdraw(9909)
    z.withdraw(12)
    print(z.bank_name)
    z.change_bank_name('中国银行')#修改类属性
    z.display()#查看修改后类属性
    BankAccount.calculate_interest(100,0.2,3)#算利息




    '''
    创建一个Animal类，实现以下魔术方法：
__init__：初始化动物名称和年龄
__str__：返回动物的描述信息
__del__：在对象销毁时打印信息

    '''
class Animal:
    def __init__(self, name, age):
        self.name = name      # 动物名称
        self.age = age        # 动物年龄

    def __str__(self):
        return f"这是一只叫 {self.name}，{self.age} 岁的动物"

    def __del__(self):
        print(f"名叫 {self.name} 的动物已经被销毁")

def part2():

    cat = Animal("小白", 3)
    print(cat)  # 输出：这是一只叫 小白，3 岁的动物
    del cat     # 输出：名叫 小白 的动物已经被销毁




class Book:
    def __init__(self, title, price):
        self.title = title
        self.price = price
# 请在此处添加 __str__ 方法
    def __str__(self):
        return f"书名{self.title}价格{self.price} "
# 此处添加封装属性的方法
    def __del__(self):
        print(f"书名{self.title}已删除")


def part3():

    # 测试代码
    book = Book("Python入门", 59.8)
    print(book) # 期望输出: 书名: 《Python入门》, 价格: 59.8元

'''
请设计一个Rectangle(矩形)类。
。属性：私有属性1ength(长),__width(宽)。
。方法:
__init__(self,length,width):初始化长和宽。
。set_length(self,length)和get_length(self):设置和获取长度，设置时需检查长度是否大
于O。
。set_width(self，width)和get_width(self):设置和获取宽度，设置时需检查宽度是否大于
O。
。get_area(self):计算并返回矩形的面积。
。get_perimeter(self):计算并返回矩形的周长。
。_str__(se1f):返回矩形的描述信息，如"矩形[长=5.0，宽=3.e]"。
编写代码测试这个类，创建一个矩形对象，计算其面积和周长，并尝试设置一个非法的负值宽度。'''
class Rectangle:
    def __init__(self,length,width):
        self.length = length
        self.width = width
    def set_length(self,length):
        if length < 0:
            return "长度必须大于0"
        self.length = length
    def get_length(self):
        return self.length
    def set_width(self,width):
        if width < 0:
            return "宽必须大于0"
        self.width = width
    def get_width(self):
        return self.width
    def get_area(self):
        return self.length*self.width
    def get_perimeter(self):
        return 2*(self.length+self.width)
    def __str__(self):
        return f"长：{self.length} 宽：{self.width}"


def part4():
    rec1=Rectangle(10,20)
    rec2=Rectangle(10,20)
    print(rec1,rec2)
    rec1.set_length(20)
    print(rec2.get_area())
    rec1.get_perimeter()
    print(rec2)



if __name__ == '__main__':
    part1()
    part2()
    part3()
    part4()